/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.innovision.generation;

import cl.innovision.helper.utils.Formateador;
import cl.innovision.vo.Procedure;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.LinkedList;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;

/**
 *
 * @author PATO
 */
public class GeneradorServicios {

    private String genDir = "C:\\Users\\PATO\\Documents\\NetBeansProjects\\InnoGen\\";
    private String project = "demo";
    private String modulo = "test";
    private Formateador u = null;
    private String baseDatos;
    private String tecnologia;
    private String extension;

    public GeneradorServicios(String genDir,String project,String modulo, String baseDatos, String tecnologia) {
        this.genDir=genDir;
        this.project=project;
        this.modulo=modulo;
        this.baseDatos=baseDatos;
        this.tecnologia=tecnologia;
        this.genDir = this.genDir +  "/cl/innovision" +  "/" + project.toLowerCase()+ "/" + modulo.toLowerCase() ;
        if(tecnologia.equals("Java"))
            extension=".java";
        if(tecnologia.equals("Net"))
            extension=".cs";
        u = new Formateador(project, modulo);

    }

    public void genIN(Procedure procedure) {

        if (procedure.getInParam().getParam().size() > 0) {

            VelocityContext context = new VelocityContext();
            context.put("p", procedure);
            context.put("u", u);
            //creo los parametros de entrada 
            
            
            try {
                String genDir = this.genDir  + "/to";
                (new File(genDir)).mkdirs();
                String filename = genDir + "/" + Formateador.firstToUpperCase(procedure.getName()) + "IN" + extension;
                Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/toin.vm");
                BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
                template.merge(context, writer);
                writer.flush();
                writer.close();
            } catch (ResourceNotFoundException e) {
                //log.fatal("No pudo encontrar un recurso", e);
                System.out.println("No pudo encontrar un recurso" + e.getMessage());
                //System.exit(1);
            } catch (ParseErrorException e) {
                //log.fatal("No pudo generar clase", e);
                System.out.println("No pudo generar clase" + e.getMessage());
              //  System.exit(1);
            } catch (Exception e) {
                System.out.println("No pudo generar clase" + e.getMessage());
                //log.fatal("No pudo generar clase", e);
              //  System.exit(1);
            }
            System.out.println("Clase Generada: "+Formateador.firstToUpperCase(procedure.getName()) + "IN");



        }
    }

    public void genRS(Procedure procedure) {

        for (int i = 0; procedure.getOutParam().getRs().size() > i; i++) {

            VelocityContext context = new VelocityContext();
            context.put("rs", procedure.getOutParam().getRs().get(i));
            context.put("u", u);
            try {
                String genDir = this.genDir   + "/to";
                (new File(genDir)).mkdirs();
                String filename = genDir + "/" + Formateador.firstToUpperCase(procedure.getOutParam().getRs().get(i).getName()) + "RS" + extension;
                Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/tors.vm");
                BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
                template.merge(context, writer);
                writer.flush();
                writer.close();
            } catch (ResourceNotFoundException e) {
                //log.fatal("No pudo encontrar un recurso", e);
                System.out.println("No pudo encontrar un recurso" + e.getMessage());
               // System.exit(1);
            } catch (ParseErrorException e) {
                //log.fatal("No pudo generar clase", e);
                System.out.println("No pudo generar clase" + e.getMessage());
               // System.exit(1);
            } catch (Exception e) {
                System.out.println("No pudo generar clase" + e.getMessage());
                //log.fatal("No pudo generar clase", e);
                //System.exit(1);
            }
            System.out.println("Clase Generada: "+Formateador.firstToUpperCase(procedure.getName()) + "RS");
        }

    }

    public void genOUT(Procedure procedure) {

        if ((procedure.getOutParam().getParam().size()+procedure.getOutParam().getRs().size()) > 0 ) {

            VelocityContext context = new VelocityContext();
            context.put("p", procedure);
            context.put("u", u);
            //creo los parametros de entrada 
            try {
                String genDir = this.genDir  + "/to";
                (new File(genDir)).mkdirs();
                String filename = genDir + "/" + Formateador.firstToUpperCase(procedure.getName()) +"OUT"+ extension;
                Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/toout.vm");
                BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
                template.merge(context, writer);
                writer.flush();
                writer.close();
            } catch (ResourceNotFoundException e) {
                //log.fatal("No pudo encontrar un recurso", e);
                System.out.println("No pudo encontrar un recurso" + e.getMessage());
               // System.exit(1);
            } catch (ParseErrorException e) {
                //log.fatal("No pudo generar clase", e);
                System.out.println("No pudo generar clase" + e.getMessage());
               // System.exit(1);
            } catch (Exception e) {
                System.out.println("No pudo generar clase" + e.getMessage());
                //log.fatal("No pudo generar clase", e);
               // System.exit(1);
            }

        }
        System.out.println("Clase Generada: "+Formateador.firstToUpperCase(procedure.getName()) + extension);

    }

    public void genDAO(LinkedList<Procedure> procedures) {
        VelocityContext context = new VelocityContext();
        context.put("p", procedures);
        context.put("u", u);

        try {
            String genDir = this.genDir   + "/dao";
            (new File(genDir)).mkdirs();
            String filename = genDir + "/" + Formateador.firstToUpperCase( modulo)  + "DAO" + extension;
            Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/dao.vm");
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
            template.merge(context, writer);
            writer.flush();
            writer.close();
        } catch (ResourceNotFoundException e) {
            //log.fatal("No pudo encontrar un recurso", e);
            System.out.println("No pudo encontrar un recurso" + e.getMessage());
           // System.exit(1);
        } catch (ParseErrorException e) {
            //log.fatal("No pudo generar clase", e);
            System.out.println("No pudo generar clase" + e.getMessage());
           // System.exit(1);
        } catch (Exception e) {
            System.out.println("No pudo generar clase" + e.getMessage());
            //log.fatal("No pudo generar clase", e);
          //  System.exit(1);
        }


        System.out.println("Clase " + "DAO generada");
    }
  
    public void genEJB(LinkedList<Procedure> procedures) {
        VelocityContext context = new VelocityContext();
        context.put("p", procedures);
        context.put("u", u);

        try {
            String genDir = this.genDir  + "/ejb";
            (new File(genDir)).mkdirs();
            String filename = genDir + "/" + Formateador.firstToUpperCase( modulo)  + "Bean" + extension;
            Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/bean.vm");
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
            template.merge(context, writer);
            writer.flush();
            writer.close();
        } catch (ResourceNotFoundException e) {
            //log.fatal("No pudo encontrar un recurso", e);
            System.out.println("No pudo encontrar un recurso" + e.getMessage());
           // System.exit(1);
        } catch (ParseErrorException e) {
            //log.fatal("No pudo generar clase", e);
            System.out.println("No pudo generar clase" + e.getMessage());
           // System.exit(1);
        } catch (Exception e) {
            System.out.println("No pudo generar clase" + e.getMessage());
            //log.fatal("No pudo generar clase", e);
            //System.exit(1);
        }
        try {
            String genDir= this.genDir + "/ejb";
            (new File(genDir)).mkdirs();
            String filename = genDir + "/" + Formateador.firstToUpperCase( modulo) + "BeanLocal" + extension;
            Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/beanlocal.vm");
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
            template.merge(context, writer);
            writer.flush();
            writer.close();
        } catch (ResourceNotFoundException e) {
            //log.fatal("No pudo encontrar un recurso", e);
            System.out.println("No pudo encontrar un recurso" + e.getMessage());
            //System.exit(1);
        } catch (ParseErrorException e) {
            //log.fatal("No pudo generar clase", e);
            System.out.println("No pudo generar clase" + e.getMessage());
            //System.exit(1);
        } catch (Exception e) {
            System.out.println("No pudo generar clase" + e.getMessage());
            //log.fatal("No pudo generar clase", e);
            //System.exit(1);
        }

        System.out.println("Clase Generada: "+Formateador.firstToUpperCase(modulo) + "Bean");
        System.out.println("Clase Generada: "+Formateador.firstToUpperCase(modulo) + "BeanLocal");
    }
    
    
    public void genAsmx(LinkedList<Procedure> procedures) {
        VelocityContext context = new VelocityContext();
        context.put("p", procedures);
        context.put("u", u);

        try {
            String genDir = this.genDir  + "/service";
            (new File(genDir)).mkdirs();
            String filename = genDir + "/" + Formateador.firstToUpperCase( modulo)  + "Service.asmx" + extension;
            Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/asmxc.vm");
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
            template.merge(context, writer);
            writer.flush();
            writer.close();
        } catch (ResourceNotFoundException e) {
            //log.fatal("No pudo encontrar un recurso", e);
            System.out.println("No pudo encontrar un recurso" + e.getMessage());
           // System.exit(1);
        } catch (ParseErrorException e) {
            //log.fatal("No pudo generar clase", e);
            System.out.println("No pudo generar clase" + e.getMessage());
           // System.exit(1);
        } catch (Exception e) {
            System.out.println("No pudo generar clase" + e.getMessage());
            //log.fatal("No pudo generar clase", e);
            //System.exit(1);
        }
        try {
            String genDir= this.genDir + "/service";
            (new File(genDir)).mkdirs();
            String filename = genDir + "/" + Formateador.firstToUpperCase( modulo) +"Service.asmx";
            Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/asmx.vm");
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
            template.merge(context, writer);
            writer.flush();
            writer.close();
        } catch (ResourceNotFoundException e) {
            //log.fatal("No pudo encontrar un recurso", e);
            System.out.println("No pudo encontrar un recurso" + e.getMessage());
            //System.exit(1);
        } catch (ParseErrorException e) {
            //log.fatal("No pudo generar clase", e);
            System.out.println("No pudo generar clase" + e.getMessage());
            //System.exit(1);
        } catch (Exception e) {
            System.out.println("No pudo generar clase" + e.getMessage());
            //log.fatal("No pudo generar clase", e);
            //System.exit(1);
        }

        System.out.println("Clase Generada: "+Formateador.firstToUpperCase(modulo) + "Bean");
        System.out.println("Clase Generada: "+Formateador.firstToUpperCase(modulo) + "BeanLocal");
    }
    
    
    public void genREST(LinkedList<Procedure> procedures) {
        VelocityContext context = new VelocityContext();
        context.put("p", procedures);
        context.put("u", u);

        try {
            String genDir = this.genDir  + "/servicios";
            (new File(genDir)).mkdirs();
            String filename = genDir + "/" + Formateador.firstToUpperCase( modulo)  + "REST" + extension;
            Template template = Velocity.getTemplate("template/"+baseDatos+"/"+tecnologia+"/rest.vm");
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
            template.merge(context, writer);
            writer.flush();
            writer.close();
        } catch (ResourceNotFoundException e) {
            //log.fatal("No pudo encontrar un recurso", e);
            System.out.println("No pudo encontrar un recurso" + e.getMessage());
           // System.exit(1);
        } catch (ParseErrorException e) {
            //log.fatal("No pudo generar clase", e);
            System.out.println("No pudo generar clase" + e.getMessage());
           // System.exit(1);
        } catch (Exception e) {
            System.out.println("No pudo generar clase" + e.getMessage());
            //log.fatal("No pudo generar clase", e);
            //System.exit(1);
        }
      
        System.out.println("Clase Generada: "+Formateador.firstToUpperCase(modulo) + "REST");
        System.out.println("Clase Generada: "+Formateador.firstToUpperCase(modulo) + "BeanLocal");
    }

    
    public void genAllClass(LinkedList<Procedure> procedures)
    {
        for (Procedure p :procedures)
        {
            genIN(p);
            genRS(p);
            genOUT(p);
        }
        genEJB(procedures);
        genDAO(procedures);
        genAsmx(procedures);
        genREST(procedures);
        
        
    }
    
    

}
